package fr.charlott.view;

import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import fr.charlott.business.dto.ProduitDTO;
import fr.charlott.business.dto.SaisonDTO;
import fr.charlott.business.service.ProduitService;
import fr.charlott.tools.exceptions.FunctionalException;
import fr.charlott.tools.exceptions.TechnicalException;

@Component("nouveauProduitControler")
@Scope("view")
public class NouveauProduitControler extends CharlottControler {

    private static final long serialVersionUID = -6404906491610002771L;

    public static final String EDITED_PRODUIT = "editedProduit";

    /**
     * Service
     */
    private ProduitService produitService;

    private ProduitDTO produit;

    private SaisonDTO selectedSaison;

    private String labelPage = "Modifier un produit";

    public NouveauProduitControler() {
        super();
    }

    @Autowired(required = true)
    public NouveauProduitControler(ProduitService produitService, ApplicationControler applicationControler) {
        super();
        this.produitService = produitService;
        this.selectedSaison = applicationControler.getSaisonCourante();

        // Recupere le produit selectionne dans la session
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        produit = (ProduitDTO) externalContext.getSessionMap().get(EDITED_PRODUIT);

        if (produit == null) {
            produit = new ProduitDTO(selectedSaison);
            externalContext.getSessionMap().put(EDITED_PRODUIT, produit);
            labelPage = "Ajouter un produit";
        }
    }

    // navigation
    public String ajouterProduit() throws TechnicalException, FunctionalException {
        try {
            produitService.ajouterProduit(produit);
            cleanSession(EDITED_PRODUIT);
            return "listeProduits";
        } catch (FunctionalException e) {
            FacesMessage msg = new FacesMessage("Error", e.getMessage());
            FacesContext.getCurrentInstance().addMessage(null, msg);
            return null;
        }

    }

    public String annuler() {
        cleanSession(EDITED_PRODUIT);
        return "listeProduits";
    }

    // getters / setters

    public ProduitDTO getProduit() {
        return produit;
    }

    public String getLabelPage() {
        return labelPage;
    }

}